package jinzhi1;

import java.util.ArrayList;
import java.util.List;

//二进制
public class Bin extends Binary{
    private  String bin;
    public Bin(String bin) {
        this.bin=bin;
    }

    /*
    函数：二进制转换二进制
    转换原理：
        二进制等于二进制；
     */
    @Override

  String toBin() {
        return bin;
    }

    /*
    函数：二进制转换十进制
    转换原理：
        1.获取的数字从左到右乘2^n-1叠加算出结果
        // 1011
        // (1*2^3)+ (0*2^2)+(1*2^1)+(1*2^0)
     */
    @Override
    long toDec() {
        long dec = 0;
        for (int i = 0; i < bin.length(); i++) {
            int x = Integer.valueOf(bin.substring(i,i+1));
            dec +=x*pingFang(2,bin.length()-i-1);
        }
        return dec;
    }

    /*
    函数：二进制转换八进制
    原理：
       1. 将二进制数字分成每三个一组
       2. 对每一组数字进行转换
       3.将转换后的结果连接起来
        (101101)
        (1*2^0+0*2^1+1*2^2)+(1*2^0+0*2^1+1*2^2)
        （1*1+0*2+1*4）+
        55
     */
    @Override
    long toOct() {
        long oct = 0;
        // 将二进制数字分成每三个一组
        List<String> group = new ArrayList<>();
        for (int i = 0; i < bin.length(); i += 3) {
            String str =bin.substring(i, Math.min(i + 3, bin.length()));
            // 如果不足3位，补0
            while (str.length() < 3) {
                // 在前面插入
                str= "0"+str;
            }
            group.add("0"+str);
            System.out.println(str);
        }
        // 对每一组数字进行转换
        List<Long> results = new ArrayList<>();
        for (String shuzi : group) {
            long result = 0;
            for (int i = 0; i < shuzi.length(); i++) {
                result += ((shuzi.charAt(i)-'0') * pingFang(2, shuzi.length() - 1 - i));
            }
            results.add(result);
        }
        // 将转换后的结果连接起来
        for (Long result : results) {
            oct = oct * 10 + result;
        }
        return oct;
    }
/*
    函数：二进制转换16进制
    原理：
        1. 将二进制数字分成每四个一组
       2. 对每一组数字进行转换
       3.判断是否大于9，大于9换成相对数字
       3.将转换后的结果连接起来
 */
    @Override
    String toHex() {
        String hex="";
        // 将二进制数字分成每四位一组
        List<String> group1 = new ArrayList<>();
        for (int i = 0; i < bin.length(); i += 4) {
            group1.add(bin.substring(i, Math.min(i + 4, bin.length())));
        }
        // 对每一组数字进行转换
        List<String> results1 = new ArrayList<>();
        for (String shuzi : group1) {
            int result1 = 0;
            for (int i = 0; i < shuzi.length(); i++) {
                result1 += (int) ((shuzi.charAt(i)-'0') * pingFang(2, shuzi.length() - 1 - i));
            }
            if (result1 > 9) {
                hex = Character.toString((char) (result1 + 55));
            } else {
                hex = Integer.toString(result1);
            }
            results1.add(hex);
        }
        // 将转换后的结果连接起来
        StringBuilder sb = new StringBuilder();
        for (String result : results1) {
            hex= String.valueOf(sb.append(result));
        }
        return hex;
    }

    public long pingFang(long num,int p){
        long result = 1;
        for (int i = 0; i < p; i++) {
            result = result*num;
        }
        return result;
    }
}
